package com.xia.utils;

import com.xia.controller.result.Result;
import com.xia.controller.result.ResultCode;
import com.xia.domain.User;
import com.xia.feign.PermissionFeign;
import com.xia.service.UserService;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Component
public class UserUtils {

    @Autowired
    private UserService userService;
    @Autowired
    private PermissionFeign permissionFeign;

    /**
     * 判断用户字段是否为空，且用户名唯一
     */
    public Result isEmpty(User user) {
        if (user.getUsername() == null) {
            return new Result(ResultCode.USER_NOT_EXISTS, "用户名不能为空");
        }
        if (user.getPassword() == null) {
            return new Result(ResultCode.USER_PASSWORD_ERROR, "密码不能为空");
        }
        if (user.getPhone() == null) {
            return new Result(ResultCode.USER_PHONE_ERROR, "手机号不能为空");
        }
        if (user.getEmail() == null) {
            return new Result(ResultCode.USER_EMAIL_ERROR, "邮箱不能为空");
        }
        // 获取所有的角色信息，判断是否已存在该用户
        List<User> userList = userService.getUserList();
        for (User u : userList) {
            if (u.getUsername().equals(user.getUsername())) {
                return new Result(ResultCode.USER_ALREADY_EXISTS, "用户已存在");
            }
        }
        return null;
    }

    /**
     * 查询用户ID
     */
    public Long findUserId(User user) {
        List<User> userList = userService.getUserList();
        // todo 未使用优化查找算法
        for (User u : userList) {
            if (u.getUsername().equals(user.getUsername())
                    && u.getPassword().equals(user.getPassword())
                    && u.getPhone().equals(user.getPhone())
                    && u.getEmail().equals(user.getEmail())) {
                return u.getUserId();
            }
        }
        return null;
    }

    /**
     * 根据用户名称来获取用户信息
     */
    public User getUserByName(String username) {
        List<User> userList = userService.getUserList();
        for (User u : userList) {
            if (u.getUsername().equals(username)) {
                return u;
            }
        }
        return null;
    }

    /**
     * 获取角色列表
     */
    public List<User> getHaveRoleUserList() {
        List<User> userList = userService.getUserList();
        for (User u : userList) {
            u.setRole(permissionFeign.getUserRoleCode(u.getUserId()));
        }
        return userList;
    }

    /**
     * 获得用户Ip，借助AI
     */
    public String getIpAddress(HttpServletRequest request) {
        // 尝试通过X-Forwarded-For头获取IP地址，这个头可能包含多个IP地址，第一个非未知的即为用户真实IP
        String ipAddress = request.getHeader("X-Forwarded-For");
        // 将IPv6地址转换为IPv4形式
        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getRemoteAddr();
            // 如果是 IPv6 环回地址，转为 IPv4 形式
            if ("0:0:0:0:0:0:0:1".equals(ipAddress)) {
                ipAddress = "127.0.0.1";
            }
        }
        // 如果IP地址为空或者未知，则尝试通过Proxy-Client-IP头获取IP地址
        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("Proxy-Client-IP");
        }
        // 如果IP地址仍为空或者未知，则尝试通过WL-Proxy-Client-IP头获取IP地址
        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("WL-Proxy-Client-IP");
        }
        // 如果所有代理相关的头都无法提供有效的IP地址，则直接使用请求的远程地址
        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getRemoteAddr();
        }
        // 返回第一个非未知的IP地址，即用户真实的IP地址
        return ipAddress.split(",")[0];
    }

    /**
     * 获取用户操作详情
     */
    public String getUserDetail(User user) {
        // 获取用户姓名
        String username = user.getUsername();
        // 获取当前操作时间
        Date now = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = sdf.format(now);
        // 获取当前操作的方法名，借助AI
        String methodName = Thread.currentThread().getStackTrace()[3].getMethodName();
        // 使用StringBuild进行拼装返回
        StringBuilder sb = new StringBuilder();
        sb.append("用户").append(username).append("于").append(time).append("进行了").append(methodName).append("操作");
        return sb.toString();
    }

}
